I have been trying to get VoiceOver focus to change when the user selects a new tab inside a UITabBar. The default behavior seems to be that it just stays on the selected tab item, which is an awful user experience.
For some reason:
UIAccessibility.post(notification: .screenChanged, argument: view)
does not work; nor does .layoutChanged work. Is there a way to set focus when a new tab is selected on a tab bar, or will I just have to hack together a solution that does not use a UIKit UITabBarController?
Post
Replies
Boosts
Views
Activity
When a user selects a new tab in a TabView via VoiceOver, the focus remains at the tab button, which is not an ideal user experience. With UIKit I could use:
UIAccessibility.post(notification: .screenChanged, argument: UIView)
to update focus; however, I can't figure out how to do something similar using SwiftUI. Is there an analogue or work around using SwiftUI, or does these ability just not exist yet?
I am new to Metal, and have no experience with OpenGL, shaders, or GPU commands. I have been trying to use Metal for video editing, and have gotten some basic stuff working, though it has been a very slow process, as the learning curve for Metal is quite steep, especially if you are coming at it as a complete GPU novice.
Can someone recommend some good resources (i.e. books or video courses) that may help me to get a better grip with the basics of Metal, and use it focused as a video editor?
I am working on an app that will use recorded narration. Is there a way to prevent VoiceOver from reading the UILabel so that it doesn't speak over the narration audio when it becomes focused?
The app uses a class that extends UILabel to listen for accessibilityDidBecomeFocused, and accessibilityDidLoseFocus to start and stop an AVAudioPlayer.
Unfortunately, VoiceOver talks over this narration, which is obviously less than idea. Any help would be very much appreciated!
I am wondering if there is a list out there of all the VoiceOver gestures that may be overridden. (e.g. accessibilityScroll, magic tap, escape, custom actions, etc).
I work on apps specifically for blind users, and tend to need to implement all sorts of custom features, as VoiceOver does not handle many of the use cases we implement. AVSpeechSynthesizer is frequently used in these cases, however, it can be a disjointed user experience because there does not seem to be a way to capture the user's speech rate, and voice settings for VoiceOver.
Is there a way to read this information from the user's settings? The most important being the VoiceOver speech rate. This would allow parts of the app the use AVSpeechSynthesizer to match the user's VoiceOver settings, giving them a better overall experience.
In my .metal code I have a struct that looks like:
struct MixerParameters
{
float2 firstScreenPosition;
float2 firstScreenSize;
float2 secondScreenPosition;
float2 secondScreenSize;
int sessionType;
int secondScreenCameraPosition;
}
On the swift side, I also have a struct:
struct MixerParameters {
var firstScreenPosition: SIMD2<Float>
var firstScreenSize: SIMD2<Float>
var secondScreenPosition: SIMD2<Float>
var secondScreenSize: SIMD2<Float>
var sessionType: Int
var secondScreenCameraPosition: Int
var isFrontCamera: Bool
}
And the data is being sent to the metal shader function via:
commandEncoder.setBytes(&parameters, length: MemoryLayout<MixerParameters>.stride, index: 0)
I am using the session type to switch on in the metal code, and everything was working fine until I tried to add a switch case.
The new case is unable to correctly see the secondScreenCameraPosition int value, which it always interprets as 0. It's not being reset anywhere else in code, and the value getting passed to the metal shader is the correct value.
If the metal shader is handling any of the other switch cases, everything was working fine. It's just on the ONE switch case.
I found that if I added another value at the end of my structs, and passed this into the metal shader, it has trouble with this very last value, but all the other values work, so as of right now, I am passing in a dummy bool value, just so I can access my secondScreenCameraPosition value properly.
This work around is very hacky, and makes no sense to me. Could anyone give a hint as to why this might be happening? Maybe my stride calculation is off somehow?
I am very new to Metal (and GPU coding in general), and am finding the learning curve to be rather steep. It's a fun journey, but there is just so much to learn. Thanks for your help and feedback!